package cn.yiueil.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 定义的切面类
 * 1、在spring中注入目标对象
 * 2、@Around指定切入点
 * 3、自定义方法实现额外功能
 * 由@Around方法和自定义方法组成切面
 */
@Aspect
public class MyAnnotationAdvice {

    //扩展: 复用切入点表达式
    @Pointcut("execution (* register(..))")
    public void myPointCut(){}

    /**
     * 日志
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution (* *(..))")//2、切入点
    public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {//3、额外功能
        System.out.println("aspectj log-------------");
        return proceedingJoinPoint.proceed();
    }

    /**
     * 事务
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("myPointCut()")//2、注解切入点
    public Object aroundTx(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {//3、额外功能
        Object proceed = null;
        try {
            System.out.println("start tx-------------");
            proceed = proceedingJoinPoint.proceed();
            System.out.println("commit tx------------");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("rollback tx----------");
        }
        return proceed;
    }
}
